home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / event.cpp < prev    next >
C/C++ Source or Header  |  1994-10-10  |  7KB  |  282 lines

  1. #include <dos.h>
  2. #include <conio.h>
  3. #include "event.h"
  4. #include "mouse2.h"
  5.  
  6. typedef void interrupt (far * interruptptr)(...);
  7.  
  8. extern EventDriver * eventdriverp;
  9. extern int get_key();
  10. /*
  11. mousestatus mousegetstatus()
  12.  {   mousestatus m;
  13.      m.buttonstate=0;
  14.      m.x=m.y=0;
  15.      if(eventdriverp->mouse_present) m= mouseGetStatus();
  16.     return m;}
  17.   /*/
  18.  
  19. ////////////////////////
  20.  
  21. int key2event (unsigned bioskeycode);
  22.  
  23.  
  24.  unsigned get_shift_keys()
  25.     {
  26.       return * (unsigned far *) MK_FP(0x40,0x17);
  27.     }
  28.  
  29.  inline unsigned press(unsigned New,unsigned Old)
  30.        { return New && (! Old);}
  31.  
  32.  inline unsigned release(unsigned New,unsigned Old)
  33.        { return Old && (! New);}
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40. #define test_mk(button,presscode,releasecode) \
  41.         if (press(news.buttonstate & button,olds.buttonstate & button))\
  42.         difference|=presscode;\
  43.         if (release(news.buttonstate & button,olds.buttonstate & button))\
  44.         difference|=releasecode;
  45.  
  46. static
  47.  unsigned  compare_mousestatus(const mousestatus& news,const mousestatus& olds)
  48.     {
  49.  
  50.  
  51.        unsigned difference=0;
  52.        if(news.buttonstate!=olds.buttonstate)
  53.       {
  54.         test_mk(MOUSELEFT,mouseeventlow::MSLP ,mouseeventlow::MSLR )
  55.         test_mk(MOUSERIGHT,mouseeventlow::MSRP ,mouseeventlow::MSRR )
  56.         test_mk(MOUSECENTER,mouseeventlow::MSCP ,mouseeventlow::MSCR )
  57.  
  58.       }
  59.        if(! ((news.where())==(olds.where()))) difference|=mouseeventlow::MSMOVE;
  60.  
  61.        int DoubleCl=news.buttonstate & 0x700;
  62.        if( DoubleCl != (olds.buttonstate & 0x700) )
  63.        difference |=DoubleCl;
  64.  
  65.        return difference;
  66.    }
  67. #undef test_mk
  68. int  keyboard101()
  69.  {
  70.    return (( * (char far *)  MK_FP(0x40,0x96) ) & 0x10) != 0   ;
  71.    }
  72.  
  73.  
  74.  
  75. static
  76. shiftkeychangetype compare_shiftstatus(unsigned new_shift,char new_del,
  77.                        unsigned old_shift,char old_del)
  78.   { enum {MASK=0xf3ff};
  79.     static unsigned long odd_bits[] = {
  80.       0x00000001,0x00000004,0x00000010,0x00000040,
  81.       0x00000100,0x00000400,0x00001000,0x00004000,
  82.       0x00010000,0x00040000,0x00100000,0x00400000,
  83.       0x01000000,0x04000000,0x10000000,0x40000000};
  84.  
  85.  
  86.     static unsigned long even_bits[]= {
  87.       0x00000002,0x00000008,0x00000020,0x00000080,
  88.       0x00000200,0x00000800,0x00002000,0x00008000,
  89.       0x00020000,0x00080000,0x00200000,0x00800000,
  90.       0x02000000,0x08000000,0x20000000,0x80000000 };
  91.  
  92.  
  93.      new_shift &= MASK;
  94.      old_shift &= MASK;
  95.      unsigned bit; int i; unsigned long res;
  96.      for(bit=1,i=0,res=0;i<16;i++,bit<<=1)
  97.        {
  98.           if(bit & new_shift) res|=odd_bits[i];
  99.           if(bit & old_shift) res|=even_bits[i];
  100.  
  101.         }
  102.      unsigned long mask;
  103.      for(mask=0x3;mask!=0l;mask<<=2)
  104.        if( (res & mask)==mask ) res^=mask;
  105.  
  106.      if(new_del && !old_del)  res|=KCDelDn;
  107.      if(! new_del && old_del) res|=KCDelUp;
  108.  
  109.       if(keyboard101())
  110.     {
  111.  
  112.         if(!  ( (KCltCtrlDn | KCltCtrlUp) & res) )
  113.         { if((KCCtrlDn | KCCtrlUp)&res) res|=KCrtCtrl;}
  114.  
  115.         if(!  ( (KCltAltDn | KCltAltUp) & res) )
  116.         { if((KCAltDn |KCAltUp)&res)res|=KCrtAlt;}
  117.  
  118.      }
  119.  
  120.       return res;
  121.   }
  122.  
  123.  
  124.  
  125.    event readevent(int mask)
  126.     {   int k;
  127.     event result;
  128.     result.what=NOEVENT;
  129.     result.kbstatus=get_shift_keys();
  130.     result.msstatus=mouseGetStatus2();
  131.     result.Delpressed=EventDriver::Delispressed;
  132.  
  133.        if (! result.what   &&   mask & SHIFTKEYEVENT)
  134.      {
  135.        shiftkeychangetype shiftchange;
  136.        shiftchange=compare_shiftstatus(result.kbstatus ,result.Delpressed,
  137.               EventDriver::oldkbstatus,EventDriver::olddelpressed);
  138.       if(shiftchange)
  139.          {
  140.            result.kbchange=shiftchange;
  141.            result.what=SHIFTKEYEVENT;
  142.         }
  143.      }
  144.  
  145.     if(!result.what  &&  mask & KEYEVENT)
  146.      {
  147.          k=get_key();
  148.          if (k!=EVENT_NO)
  149.         { result.what=KEYEVENT; result.key= k;}
  150.      }
  151.  
  152.        if (! result.what   &&   mask & MOUSEEVENT)
  153.       {
  154.          unsigned mousechange=
  155.          compare_mousestatus(result.msstatus,EventDriver::oldmsstatus);
  156.          if (mousechange)
  157.         {
  158.          result.mousechange=mousechange;
  159.          result.what=MOUSEEVENT;
  160.         }
  161.       }
  162.  
  163.        EventDriver::oldkbstatus=result.kbstatus;
  164.        EventDriver::oldmsstatus=result.msstatus;
  165.        EventDriver::olddelpressed=result.Delpressed;
  166.  
  167.       return result;
  168.     }
  169.  
  170. //**********************************************
  171.  
  172.    int eventavail(int mask,int mousemask)
  173.    {
  174.       if(mask & KEYEVENT) if(kbhit()) return 1;
  175.       if(mask & MOUSEEVENT)
  176.       {       mousestatus mstatus=mouseGetStatus2();
  177.           unsigned change=
  178.          compare_mousestatus(mstatus,EventDriver::oldmsstatus)
  179.          & mousemask;
  180. //!!!!
  181.          if(!change)  EventDriver::oldmsstatus=mstatus; // "eat up" event
  182.  
  183.           if(change) return 1;
  184.      }
  185.  
  186.       if(mask & SHIFTKEYEVENT)
  187.      {
  188.        unsigned  kbstatus=get_shift_keys();
  189.        int Delpressed=EventDriver::Delispressed;
  190.        shiftkeychangetype shiftchange;
  191.        shiftchange=compare_shiftstatus(kbstatus ,Delpressed,
  192.               EventDriver::oldkbstatus,EventDriver::olddelpressed);
  193. //!!!!
  194.  
  195.        if(shiftchange!=0)return 1;
  196.       }
  197.       return 0;
  198.    }
  199.  
  200.  event getevent(int mask,int mousemask)
  201.     {   event evt;
  202.  
  203.       do{
  204.       do{
  205.        while(!eventavail(mask,mousemask));
  206.  
  207.     evt=readevent(mask);
  208.  
  209.     }
  210.     while(!evt);
  211.     if( evt.what!=MOUSEEVENT ) return evt;
  212.     if (evt.mousechange & mousemask) return evt;
  213.        } while(1);
  214.     }
  215.  
  216. /*
  217.  
  218.  event getevent(int mask,int mousemask)
  219.     {   event evt;
  220.  
  221.      thebeginning:
  222.       do{
  223.     evt=readevent(mask);
  224.        } while(! evt);
  225.  
  226.       if( evt.what!=MOUSEEVENT ) return evt;
  227.       if (evt.mousechange & mousemask) return evt;
  228.       goto thebeginning;  // I'm soo-o bad
  229.     }
  230.  
  231. */
  232. // Event Driver Static Vars
  233.  
  234.     void far * EventDriver::oldkbhandler;
  235.        unsigned EventDriver::oldkbstatus=0;
  236.        mousestatus EventDriver::oldmsstatus={0,0,0};
  237.          volatile char EventDriver::Delispressed=0;
  238.        unsigned char EventDriver::break_code=0;
  239.        char EventDriver::olddelpressed=0;
  240. static  EventDriver * theEventDriverp;
  241. static void start_() { theEventDriverp=new EventDriver;}
  242. static  void exit_() {delete theEventDriverp;}
  243. #pragma startup start_ 90
  244. #pragma exit exit_ 90
  245.    EventDriver::EventDriver()
  246.       {
  247.       oldkbhandler=getvect(0x9);
  248.       setvect(0x9,(interruptptr)EventDriver::kbhandler);
  249.         oldkbstatus=get_shift_keys();
  250.         oldmsstatus=mouseGetStatus2();
  251.         olddelpressed=Delispressed;
  252.       }
  253.  
  254. #define DEL_SCAN 0x53
  255.    void far interrupt EventDriver::kbhandler()
  256.      {    typedef void (far * farfunc)();
  257.  
  258.         unsigned char scan=inportb(0x60);
  259.         scan|=break_code;
  260.         break_code= scan==0xf0 ? 0x80 : 0;
  261.         if ( scan==DEL_SCAN  ) Delispressed=1;
  262.         if ( scan==(DEL_SCAN |0x80)) Delispressed=0;
  263.  
  264.         asm pushf;
  265.         (farfunc(oldkbhandler))();
  266.       }
  267.  
  268.  
  269.  
  270.    EventDriver::~EventDriver()
  271.      {
  272.       setvect(0x9,(interruptptr)oldkbhandler);
  273.      }
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.